use std::marker::PhantomData;

use crate::Value;

fn match_value(s: &str) -> Value {
    match s {
        "i8" => Value::I32(0),
        "u8" => Value::I32(0),
        "i16" => Value::I32(0),
        "u16" => Value::I32(0),
        "i32" => Value::I32(0),
        "u32" => Value::I64(0),
        "i64" => Value::I64(0),
        "f32" => Value::F32(0.),
        "f64" => Value::F64(0.),
        "u128" => Value::V128(0),
        _ => panic!("unsupport type for WasmFnIO"),
    }
}
pub trait WasmFnIO {
    fn parameters() -> Vec<Value>
    where
        Self: Sized,
    {
        Vec::new()
    }
}

pub struct I1<O1> {
    phantom_1: PhantomData<O1>,
}

impl<O1> WasmFnIO for I1<O1> {
    fn parameters() -> Vec<Value> {
        vec![match_value(std::any::type_name::<O1>())]
    }
}

pub struct I2<O1, O2> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
}

impl<O1, O2> WasmFnIO for I2<O1, O2> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
        ]
    }
}

pub struct I3<O1, O2, O3> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
}

impl<O1, O2, O3> WasmFnIO for I3<O1, O2, O3> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
        ]
    }
}

pub struct I4<O1, O2, O3, O4> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
}

impl<O1, O2, O3, O4> WasmFnIO for I4<O1, O2, O3, O4> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
        ]
    }
}

pub struct I5<O1, O2, O3, O4, O5> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
}

impl<O1, O2, O3, O4, O5> WasmFnIO for I5<O1, O2, O3, O4, O5> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
        ]
    }
}

pub struct I6<O1, O2, O3, O4, O5, O6> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
}

impl<O1, O2, O3, O4, O5, O6> WasmFnIO for I6<O1, O2, O3, O4, O5, O6> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
        ]
    }
}

pub struct I7<O1, O2, O3, O4, O5, O6, O7> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
}

impl<O1, O2, O3, O4, O5, O6, O7> WasmFnIO for I7<O1, O2, O3, O4, O5, O6, O7> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
        ]
    }
}

pub struct I8<O1, O2, O3, O4, O5, O6, O7, O8> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8> WasmFnIO for I8<O1, O2, O3, O4, O5, O6, O7, O8> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
        ]
    }
}

pub struct I9<O1, O2, O3, O4, O5, O6, O7, O8, O9> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9> WasmFnIO for I9<O1, O2, O3, O4, O5, O6, O7, O8, O9> {
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
        ]
    }
}

pub struct I10<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10> WasmFnIO
    for I10<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
        ]
    }
}

pub struct I11<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11> WasmFnIO
    for I11<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
        ]
    }
}

pub struct I12<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12> WasmFnIO
    for I12<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
        ]
    }
}

pub struct I13<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13> WasmFnIO
    for I13<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
        ]
    }
}

pub struct I14<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14> WasmFnIO
    for I14<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
        ]
    }
}

pub struct I15<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15> WasmFnIO
    for I15<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
        ]
    }
}

pub struct I16<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16> WasmFnIO
    for I16<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
        ]
    }
}

pub struct I17<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17> WasmFnIO
    for I17<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
        ]
    }
}

pub struct I18<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18> WasmFnIO
    for I18<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
        ]
    }
}

pub struct I19<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18, O19>
{
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18, O19> WasmFnIO
    for I19<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18, O19>
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
        ]
    }
}

pub struct I20<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
}

impl<O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14, O15, O16, O17, O18, O19, O20>
    WasmFnIO
    for I20<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
        ]
    }
}

pub struct I21<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
    > WasmFnIO
    for I21<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
        ]
    }
}

pub struct I22<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
    > WasmFnIO
    for I22<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
        ]
    }
}

pub struct I23<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
    > WasmFnIO
    for I23<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
        ]
    }
}

pub struct I24<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
    > WasmFnIO
    for I24<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
        ]
    }
}

pub struct I25<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
    > WasmFnIO
    for I25<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
        ]
    }
}

pub struct I26<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
    O26,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
    phantom_26: PhantomData<O26>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
    > WasmFnIO
    for I26<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
            match_value(std::any::type_name::<O26>()),
        ]
    }
}

pub struct I27<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
    O26,
    O27,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
    phantom_26: PhantomData<O26>,
    phantom_27: PhantomData<O27>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
    > WasmFnIO
    for I27<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
            match_value(std::any::type_name::<O26>()),
            match_value(std::any::type_name::<O27>()),
        ]
    }
}

pub struct I28<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
    O26,
    O27,
    O28,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
    phantom_26: PhantomData<O26>,
    phantom_27: PhantomData<O27>,
    phantom_28: PhantomData<O28>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
    > WasmFnIO
    for I28<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
            match_value(std::any::type_name::<O26>()),
            match_value(std::any::type_name::<O27>()),
            match_value(std::any::type_name::<O28>()),
        ]
    }
}

pub struct I29<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
    O26,
    O27,
    O28,
    O29,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
    phantom_26: PhantomData<O26>,
    phantom_27: PhantomData<O27>,
    phantom_28: PhantomData<O28>,
    phantom_29: PhantomData<O29>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
    > WasmFnIO
    for I29<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
            match_value(std::any::type_name::<O26>()),
            match_value(std::any::type_name::<O27>()),
            match_value(std::any::type_name::<O28>()),
            match_value(std::any::type_name::<O29>()),
        ]
    }
}

pub struct I30<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
    O26,
    O27,
    O28,
    O29,
    O30,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
    phantom_26: PhantomData<O26>,
    phantom_27: PhantomData<O27>,
    phantom_28: PhantomData<O28>,
    phantom_29: PhantomData<O29>,
    phantom_30: PhantomData<O30>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
        O30,
    > WasmFnIO
    for I30<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
        O30,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
            match_value(std::any::type_name::<O26>()),
            match_value(std::any::type_name::<O27>()),
            match_value(std::any::type_name::<O28>()),
            match_value(std::any::type_name::<O29>()),
            match_value(std::any::type_name::<O30>()),
        ]
    }
}

pub struct I31<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
    O26,
    O27,
    O28,
    O29,
    O30,
    O31,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
    phantom_26: PhantomData<O26>,
    phantom_27: PhantomData<O27>,
    phantom_28: PhantomData<O28>,
    phantom_29: PhantomData<O29>,
    phantom_30: PhantomData<O30>,
    phantom_31: PhantomData<O31>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
        O30,
        O31,
    > WasmFnIO
    for I31<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
        O30,
        O31,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
            match_value(std::any::type_name::<O26>()),
            match_value(std::any::type_name::<O27>()),
            match_value(std::any::type_name::<O28>()),
            match_value(std::any::type_name::<O29>()),
            match_value(std::any::type_name::<O30>()),
            match_value(std::any::type_name::<O31>()),
        ]
    }
}

pub struct I32<
    O1,
    O2,
    O3,
    O4,
    O5,
    O6,
    O7,
    O8,
    O9,
    O10,
    O11,
    O12,
    O13,
    O14,
    O15,
    O16,
    O17,
    O18,
    O19,
    O20,
    O21,
    O22,
    O23,
    O24,
    O25,
    O26,
    O27,
    O28,
    O29,
    O30,
    O31,
    O32,
> {
    phantom_1: PhantomData<O1>,
    phantom_2: PhantomData<O2>,
    phantom_3: PhantomData<O3>,
    phantom_4: PhantomData<O4>,
    phantom_5: PhantomData<O5>,
    phantom_6: PhantomData<O6>,
    phantom_7: PhantomData<O7>,
    phantom_8: PhantomData<O8>,
    phantom_9: PhantomData<O9>,
    phantom_10: PhantomData<O10>,
    phantom_11: PhantomData<O11>,
    phantom_12: PhantomData<O12>,
    phantom_13: PhantomData<O13>,
    phantom_14: PhantomData<O14>,
    phantom_15: PhantomData<O15>,
    phantom_16: PhantomData<O16>,
    phantom_17: PhantomData<O17>,
    phantom_18: PhantomData<O18>,
    phantom_19: PhantomData<O19>,
    phantom_20: PhantomData<O20>,
    phantom_21: PhantomData<O21>,
    phantom_22: PhantomData<O22>,
    phantom_23: PhantomData<O23>,
    phantom_24: PhantomData<O24>,
    phantom_25: PhantomData<O25>,
    phantom_26: PhantomData<O26>,
    phantom_27: PhantomData<O27>,
    phantom_28: PhantomData<O28>,
    phantom_29: PhantomData<O29>,
    phantom_30: PhantomData<O30>,
    phantom_31: PhantomData<O31>,
    phantom_32: PhantomData<O32>,
}

impl<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
        O30,
        O31,
        O32,
    > WasmFnIO
    for I32<
        O1,
        O2,
        O3,
        O4,
        O5,
        O6,
        O7,
        O8,
        O9,
        O10,
        O11,
        O12,
        O13,
        O14,
        O15,
        O16,
        O17,
        O18,
        O19,
        O20,
        O21,
        O22,
        O23,
        O24,
        O25,
        O26,
        O27,
        O28,
        O29,
        O30,
        O31,
        O32,
    >
{
    fn parameters() -> Vec<Value> {
        vec![
            match_value(std::any::type_name::<O1>()),
            match_value(std::any::type_name::<O2>()),
            match_value(std::any::type_name::<O3>()),
            match_value(std::any::type_name::<O4>()),
            match_value(std::any::type_name::<O5>()),
            match_value(std::any::type_name::<O6>()),
            match_value(std::any::type_name::<O7>()),
            match_value(std::any::type_name::<O8>()),
            match_value(std::any::type_name::<O9>()),
            match_value(std::any::type_name::<O10>()),
            match_value(std::any::type_name::<O11>()),
            match_value(std::any::type_name::<O12>()),
            match_value(std::any::type_name::<O13>()),
            match_value(std::any::type_name::<O14>()),
            match_value(std::any::type_name::<O15>()),
            match_value(std::any::type_name::<O16>()),
            match_value(std::any::type_name::<O17>()),
            match_value(std::any::type_name::<O18>()),
            match_value(std::any::type_name::<O19>()),
            match_value(std::any::type_name::<O20>()),
            match_value(std::any::type_name::<O21>()),
            match_value(std::any::type_name::<O22>()),
            match_value(std::any::type_name::<O23>()),
            match_value(std::any::type_name::<O24>()),
            match_value(std::any::type_name::<O25>()),
            match_value(std::any::type_name::<O26>()),
            match_value(std::any::type_name::<O27>()),
            match_value(std::any::type_name::<O28>()),
            match_value(std::any::type_name::<O29>()),
            match_value(std::any::type_name::<O30>()),
            match_value(std::any::type_name::<O31>()),
            match_value(std::any::type_name::<O32>()),
        ]
    }
}
